<?php

namespace App\Miya\UIData;

use App\Miya\Models\BannerGroup;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class BannerData extends CommonData
{
    protected $name = 'banner';
    protected $fields = ['id', 'image', 'title', 'url', 'banner_group_id'];

    /**
     * 通过Banner ID获取到banner组信息
     * @param $id
     *
     * @operate 遍历后调用
     *
     * @data image 图片地址
     * @data title 图片说明
     * @data url 图片超链接
     */
    public function get($id): Collection
    {
        return $this->dataCache(function () use ($id) {
            $group = BannerGroup::with(['banners' => function ($query) {
                $query->select($this->fields);
            }])->find($id);

            if (!$group) {
                $msg = sprintf('Banner组未找到id为 %s 的数据信息', $id);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseData($group);
        }, __METHOD__, $id);
    }

    /**
     * 通过Banner Tag获取到banner组信息
     * @param $tag
     *
     * @operate 遍历后调用
     *
     * @data image 图片地址
     * @data title 图片说明
     * @data url 图片超链接
     */
    public function getByTag($tag): Collection
    {
        return $this->dataCache(function () use ($tag) {
            $group = BannerGroup::whereTag($tag)->with(['banners' => function ($query) {
                $query->select($this->fields);
            }])->first();
            if (!$group) {
                $msg = sprintf('Banner组未找到tag为 %s 的数据信息', $tag);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseData($group);
        }, __METHOD__, $tag);
    }

    /**
     * 通过banner组id随机选出指定数量的图片进行展示
     *
     * @param $id
     * @param int $num
     *
     * @operate $num=1时直接调用 $num>1时遍历后使用
     *
     * @data image 图片地址
     * @data title 图片说明
     * @data url 图片超链接
     */
    public function random($id, $num = 1)
    {
        $data = $this->get($id);

        $images = $data->random($num);
        if ($num == 1) {
            return $images->first();
        }

        return $images;
    }

    /**
     * 通过banner组tag随机选出指定数量的图片进行展示
     *
     * @param $id
     * @param int $num
     *
     * @operate $num=1时直接调用 $num>1时遍历后使用
     *
     * @data image 图片地址
     * @data title 图片说明
     * @data url 图片超链接
     */
    public function randomByTag($tag, $num = 1)
    {
        $data = $this->getByTag($tag);

        $images = $data->random($num);
        if ($num == 1) {
            return $images->first();
        }

        return $images;
    }

    /**
     * 处理Banner数据
     * @param BannerGroup $group
     * @return Collection
     */
    protected function parseData(BannerGroup $group): Collection
    {
        $banners = $group->banners->map(function ($banner) {
            $banner->image = asset('uploads/' . $banner->image);
            unset($banner->banner_group_id);
            return $banner;
        });

        return $banners;
    }
}
